# 类的私有方法执行顺序
# 实例化一个类的实例对象，先调用 __new__() 然后调用 __init__() 当执行p1()带括号的，时候才会执行__call__()

class Person(object):
    a = 1
    def __init__(cls):
        cls.a = 2
        print(cls.a)
        print('__init__ 被调用')
    def __new__(cls, *args, **kwargs):
        cls.a = 3
        print(cls.a)
        print('__new__ 被调用')
        return object.__new__(cls)
    def __call__(cls, *args, **kwargs):
        cls.a = 4
        print(cls.a)
        print('__call__ 被调用')


if __name__ == '__main__':
    p1 = Person()
    # p1() # 只有在 p1() 这个实例带括号的时候被调用的时候，__call__函数才会被调用
    # p2 = Person()

    # is 比较的是内存中是不是一个对象，内存地址是否一样
    # print(p1 is p2)


    # python中    p1 = Person() 实际上会先调用 类的 __call__函数，再调用 __new__函数